﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Core.ProcessManager.Server;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;

namespace Sinacor.Process.Bovespa.Distribuicao.Server.ProcessLogic
{
    public class ProcessamentoImportacao : BaseProcessLogic
    {
        #region Atributos

        private int _erroGeralImportacaoArquivo = 109853;

        #endregion

        #region Eventos

        public event EventHandler ProcessamentoConcluido;

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public ProcessamentoImportacao()
        {
        }

        #endregion

        #region Propriedades

        public int ErroGeralImportacaoArquivo
        {
            get { return _erroGeralImportacaoArquivo; }
            set { _erroGeralImportacaoArquivo = value; }
        }

        #endregion

        #region Métodos Públicos

        public void ProcessarDistribuicao(ProcessEntity.Parameter.FiltroProcessamentoDistribuicao entity)
        {
            ProcessEntity.Resultado resultado;
            ResourceAccess.Importacao raImportacao = new ResourceAccess.Importacao();
            int porcentagem = 80;

            AtualizaStatus(porcentagem, "Bovespa.ImportacaoExportacao.Label.ProcessandoDistribuicoes");

            if (entity.Header.TipoDistribuicao.HasValue)
            {
                entity.Header.TipoDistribuicao = ProcessEntity.Enum.TipoDistribuicao.PrecoMedioDigitado;
            }

            resultado = raImportacao.ProcessarDistribuicao(entity);

            if (!resultado.Sucesso)
                TratarExcecoes(resultado);

            porcentagem = 90;
            AtualizaStatus(porcentagem, "Bovespa.ImportacaoExportacao.Label.FinalizandoProcessamento");

            if (ProcessamentoConcluido != null)
            {
                ProcessamentoConcluido(this, new EventArgs());
            }
        }

        #endregion

        #region Métodos Privados

        private void TratarExcecoes(ProcessEntity.Resultado request)
        {
            List<Object> _params;

            if (request.CodigoErro == -1)
            {
                throw new BusinessException(this.ErroGeralImportacaoArquivo);
            }
            else
            {
                if (!String.IsNullOrEmpty(request.Argumentos))
                {
                    _params = ErrorMessage.ConvertXmlArgumentsToParameters(request.Argumentos);

                    throw new BusinessException(request.CodigoErro, _params.ToArray());
                }
                else
                {
                    throw new BusinessException(request.CodigoErro);
                }
            }
        }

        private void AtualizaStatus(decimal progress, string resourceKey)
        {
            this.Status.Progress = Convert.ToInt32(Math.Round(progress, 0, MidpointRounding.ToEven));
            this.Status.Step = resourceKey;
            this.SendStatus();
        }

        #endregion
    }
}
